import {
  message
} from 'antd';
import {
  observable,
  action
} from 'mobx';
import {
  WeaForm
} from 'comsMobx';
import * as API from '../apis/systeminfo';
import * as Util from '../util/index';
import moment from 'moment';
import _isNaN from 'lodash/isNaN';
import * as mobx from 'mobx';
import {
  WeaTools
} from 'ecCom'
import * as PublicFunc from '../util/pulic-func';
import {
  i18n
} from '../public/i18n';
import {
  WeaLocaleProvider
} from 'ecCom';
import {
  checkWeakPass
} from "../util/PASSUtil.js";

const getLabel = WeaLocaleProvider.getLabel;
const toJS = mobx.toJS;

export class HrmSystemInfo {
  loading = false;
  title = i18n.label.sysInfo;
  viewDate = new moment().format('YYYY-MM-DD');
  pickerValue = new moment().add(1, 'day').format('YYYY-MM-DD');

  @observable hrmId = '';
  @observable isEditor = false;
  @observable checkValue = '0';
  @observable inputVlaue = '';
  @observable selectValue = '0';
  @observable form = new WeaForm();
  @observable buttons = {};
  @observable formFields = [];
  @observable settings = {};
  @observable weekInfo = {};
  @observable date = new Date().getTime();
  @observable isSelef = false;
  @observable openRSA = "0";

  @observable options = [{
    key: '0',
    showname: '启用'
  }, {
    key: '2',
    showname: '网段策略'
  }];

  @observable bodyConf = [{
    title: '签到信息',
    icon: 'icon-Human-resources-Sign-in-information',
    fields: ['signintime', 'signinip'],
    isRow: false,
    fieldsConf: [{
      title: '时间',
      icon: 'icon-Human-resources-late',
    }, {
      title: 'IP',
      icon: 'icon-Human-resources-IP',
      isIp: true,
    }]
  }, {
    title: '签退信息',
    icon: 'icon-Human-resources-Sign-out',
    fields: ['signouttime', 'signoutip'],
    isRow: false,
    fieldsConf: [{
      title: '时间',
      icon: 'icon-Human-resources-late',
    }, {
      title: 'IP',
      icon: 'icon-Human-resources-IP',
      isIp: true,
    }]
  }, {
    title: '微博填写',
    icon: 'icon-Human-resources-micro-blog',
    fields: ['blogcreated'],
    isRow: true,
    fieldsConf: [{
      title: '时间',
      icon: 'icon-Human-resources-late',
    }]
  }, {
    title: '出差信息',
    icon: 'icon-Human-resources-business-travel',
    fields: ['businesstravelbegin', 'businesstravelend'],
    isRow: false,
    fieldsConf: [{
      title: '开始',
      icon: 'icon-Human-resources-late',
    }, {
      title: '结束',
      icon: 'icon-Human-resources-late',
    }]
  }, {
    title: '移动签到',
    icon: 'icon-Human-resources-Mobile-sign-in',
    fields: ['mobilesignaddr'],
    isRow: true,
    fieldsConf: [{
      title: '地址',
      icon: 'icon-Human-resources-Mobile-sign-in',
    }]
  }]

  @action
  init = () => {
    this.viewDate = new moment().format('YYYY-MM-DD');
    this.isEditor = false;
    this.checkValue = '0';
    this.inputVlaue = '';
    this.selectValue = '0';
    this.form = new WeaForm();
    this.buttons = {};
    this.formFields = [];
    this.settings = {};
    this.weekInfo = {};
  }

  getFormField = () => {
    let params = {
      id: this.hrmId
    };
    API.getFormField(params).then((data) => {
      this.buttons = data.buttons;
      this.formFields = data.condition;
      this.checkValue = data.needauto,
        this.pickerValue = data.enableDate,
        this.selectValue = data.enableUsbType,
        this.inputVlaue = data.enableDate && data.enableDate != '' && moment(data.enableDate).diff(moment(), 'days') + 1,
        this.settings = data.settings;
      this.isSelef = data.isSelef;
      this.openRSA = data.openRSA;
      this.form.initFormFields(data.condition);
    });
  }

  getWeekInfo = (v) => {
    let params = {
      id: this.hrmId,
      datefrom: v
    };
    API.getWeekInfo(params).then((data) => {
      this.weekInfo = data
    });
  }

  getDateLabel = () => {
    let str = this.viewDate;
    if (new moment().format('YYYY-MM-DD') == this.viewDate) str = '今天';
    return str;
  }

  onCheckChange = (v) => {
    this.checkValue = v;
  }

  onInputChange = (v) => {
    if (v && !_isNaN(parseInt(v)) && parseInt(v) > 0) {
      this.inputVlaue = v;
      this.pickerValue = new moment().add(parseInt(v), 'day').format('YYYY-MM-DD');
    } else {
      this.inputVlaue = '';
    }
  }

  onPickerChange = (v) => {
    this.pickerValue = v;
    this.inputVlaue = moment(v).diff(moment(), 'days') + 1;
  }

  onSelectChange = (v) => {
    this.selectValue = v;
  }

  edit = () => {
    const formParams = this.getFormParams();
    const usbState = formParams.usbstate || '';

    this.formFields && this.formFields.forEach(c => {
      c.items.forEach(field => {
        let domkey = field.domkey[0] || '';
        if ((usbState == '0' && (domkey == 'tokenKey' || domkey == 'serial')) || domkey === 'validatecode') {
          field.viewAttr = 3;
        } else {
          field.viewAttr = 2;
        }
        if (field.conditionType == 'BROWSER') {
          field.browserConditionParam.viewAttr = 2;
        }
        if (domkey === 'classification' && this.isSelef) {
          field.viewAttr = 1;
        }
      });
    });
    this.isEditor = true;
  }

  doSave = () =>{
    if(this.loading) return;
    this.loading = true;
    const formParams = this.form.getFormParams();
    const userUsbType = formParams.userUsbType || '';
    const usbstate = formParams.usbstate || '';
    const tokenKey = formParams.tokenKey || '';
    const hrmId = this.hrmId;
    if (!this.beforeSave()) {
      this.loading = false;
      return false;
    }

    let __this = this;

    if (userUsbType == "3" && usbstate != "1" && tokenKey != "") { //动态令牌
      let params = {};
      params.id = hrmId;
      params.tokenKey = tokenKey;
      WeaTools.callApi('/api/hrm/sysadmin/checkIsUsed', 'POST', params).then((data) => {
        if (data.isUsed) {
          message.warning('令牌序列号已经绑定给' + data.lastname + '，不能重复绑定！');
          this.loading = false;
        } else {
          __this.doAjaxSave();
        }
      })
    } else {
      __this.doAjaxSave();
    }
  }

  RSAEcrypt = (password,password1) => {
    return new Promise( (resolve, reject) => {
      //异步加载ras文件
      loadjs.isDefined('rsa') ? loadjs.ready('rsa', () => {
        if ( this.openRSA &&  this.openRSA == '1') {
          password = __RSAEcrypt__.rsa_data_encrypt(password);
          password1 = __RSAEcrypt__.rsa_data_encrypt(password1);
        }
        resolve({password,password1});
      }) : loadjs(["/js/rsa/jsencrypt.js", "/js/rsa/rsa.js"], 'rsa', {
        async: false,
        success: () => {
          if (this.openRSA && this.openRSA == '1') {
            const callback = () => {
              password = __RSAEcrypt__.rsa_data_encrypt(password);
              password1 = __RSAEcrypt__.rsa_data_encrypt(password1);
              resolve({password, password1});
            }
            __RSAEcrypt__.initRsaCode(callback);
          } else {
            resolve({password, password1});
          }
        }
      });
    })
  }

  doAjaxSave = () => {
    const hrmId = this.hrmId;
    const formParams = this.form.getFormParams();
    let params = {
      needauto: this.checkValue,
      enableDate: this.pickerValue,
      enableUsbType: this.selectValue
    };
    params = { ...{
        id: hrmId
      },
      ...params,
      ...formParams
    };

    let {
      password,
      password1
    } = params;

    this.RSAEcrypt(password,password1).then(data => {
      params = {
        ...params,
        password:data.password,
        password1:data.password1
      }

      const {
        validatecode
      } = formParams;

      if (!validatecode) {
        message.warning(getLabel(386319, '必填字段不完整！'));
        this.loading = false;
        return
      }
      const save = () => {
        API.doSave(params).then((data) => {
          if (data.status == '1') {
            message.success(i18n.message.saveSuccess());
            this.isEditor = false;
            this.getFormField();

            this.form.updateFields({
              validatecode: {
                value: ''
              }
            });
          } else {
            message.warning(data.message);
          }
          this.loading = false;
          this.date = new Date().getTime();
        }, error => {
          message.warning(error.message);
          this.loading = false;
        })
      }
      if (formParams.password === "qwertyuiop") {
        save();
      }else{
        checkWeakPass(params.password,() => {
          save();
        },() =>{
          this.loading = false;
          this.date = new Date().getTime();
        })
      }

    })

  }

  backCard = () => {
    this.form.updateFields({
      validatecode: {
        value: ''
      }
    });
    const hrmId = this.hrmId;
    this.isEditor = false;
    this.getFormField({
      hrmId
    });
  }

  updateKey = () => {
    const formParams = this.form.getFormParams();
    let needusb = formParams.userUsbType || '';
    if (needusb == "2") {
      let returnstr = PublicFunc.getUserName() || '';
      if (returnstr != "") {
        form.updateFields({ ...formParams,
          ...{
            loginid: {
              name: 'loginid',
              value: returnstr
            }
          }
        });
      }
    } else if (needusb == "3") {
      this.bindTokenKey();
    }
  }

  bindTokenKey = () => {
    const hrmId = this.hrmId;
    const title = "";
    let url = "/spa/hrm/index_mobx.html#/main/hrm/BindTokenKey?requestFrom=system&userid=" + hrmId;
    const dialog = ecCom.WeaTools.createDialog({
      title,
      url,
      style: {
        width: 700,
        height: 365
      }
    });
    dialog.show();
  }

  beforeSave = () => {
    const formParams = this.form.getFormParams();
    const userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
    const isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
    const isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
    const userUsbType = formParams.userUsbType || '';
    const usbstate = formParams.usbstate || '';
    const serial = formParams.serial || '';
    const tokenKey = formParams.tokenKey || '';
    const loginid = formParams.loginid || '';
    const email = formParams.email || '';
    const needauto = this.checkValue || '';
    const enableDate = this.pickerValue || '';

    let username = "";

    if (userUsbType == 2) {
      if (!isIE) {
        message.warning("您的浏览器不支持修改使用海泰key的账号密码，请使用IE浏览器");
        return false;
      }
      //读取硬件usbkey赋值
      username = PublicFunc.getUserName();
      if (username == '') return false;
    }

    if (usbstate != "1") {
      let flag = true;
      if (userUsbType == "2" && serial == "") {
        flag = false;
      } else if (userUsbType == "3" && tokenKey == "") {
        flag = false;
      }
      if (!flag) {
        message.warning(i18n.message.requireFieldNone());
        return false;
      }
    }

    if (needauto == '1' && enableDate == '') {
      message.warning(i18n.message.requireFieldNone());
      return false;
    }

    if (tokenKey != "" && (!this.isdigit(tokenKey) || tokenKey.length != 10)) {
      message.warning(getLabel(387344, "令牌序列号必须为10位数字！"));
      return false;
    }



    if (loginid.indexOf(" ") != -1 || loginid.indexOf(";") != -1 || loginid.indexOf("--") != -1 || loginid.indexOf("'") != -1) {
      message.warning(getLabel(387345, "登录名中不能有“空格、分号、--、单引号”字符"));
      return false;
    }

    if ("2" == userUsbType) { //海泰key
      if (loginid != username) {
        message.warning(getLabel(387346, "系统用户名与Key中的不匹配！"));
        return false;
      }
    }
    if (!this.checkPassword()) return false;
    if (!PublicFunc.chkMail(email)) return false;
    return true;
  }

  isdigit = (s) => {
    var r, re;
    re = /\d*/i; //\d表示数字,*表示匹配多个数字
    r = s.match(re);
    return (r == s) ? true : false;
  }

  checkPassword = () => {
    const formParams = this.form.getFormParams();
    let cs = formParams.password || ''; //新密码
    let cs1 = formParams.password1 || ''; //确认密码
    let passwordComplexity = this.settings.passwordComplexity;
    let minpasslen = this.settings.minpasslen;
    let checkpass = true;

    if (cs == '' || cs == "qwertyuiop") return checkpass;

    if (cs.length < minpasslen) {
      message.warning(getLabel(387347, "密码长度不能小于") + minpasslen);
      return false;
    }
    if (cs != cs1) {
      message.warning(getLabel(387351, "密码确认不正确"));
      return false;
    }

    if (passwordComplexity == "1") {
      const complexity11 = /[a-z]+/;
      const complexity12 = /[A-Z]+/;
      const complexity13 = /\d+/;
      if (cs != "") {
        if (complexity11.test(cs) && complexity12.test(cs) && complexity13.test(cs)) {
          checkpass = true;
        } else {
          message.warning(getLabel(387352, "新密码不符合要求，必须为字母大写、字母小写、数字组合！请重新输入！"));
          checkpass = false;
        }
      }
    } else if (passwordComplexity == "2") {
      const complexity21 = /[a-zA-Z_]+/;
      const complexity22 = /\W+/;
      const complexity23 = /\d+/;
      if (cs != "") {
        if (complexity21.test(cs) && complexity22.test(cs) && complexity23.test(cs)) {
          checkpass = true;
        } else {
          message.warning(getLabel(387353, "新密码不符合要求，必须为字母、数字、特殊字符组合！请重新输入！"));
          checkpass = false;
        }
      }
    }
    return checkpass;
  }

  onPickerHandler = (v) => {
    v = new moment(v).format('YYYY-MM-DD');
    this.getWeekInfo(v);
    this.viewDate = v;
  }

  getFormParams = () => {
    return this.form.getFormParams();
  }

}